<!DOCTYPE html>
<meta charset=utf-8>
<title>Input element value mode</title>
<link rel="author" title="Denis Ah-Kang" href="mailto:denis@w3.org">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="log"></div>
<script>
// MODE DEFAULT
test(function () {
  var input = document.createElement("input");
  input.type = "hidden";
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "foo\r\r\n\n\0");
}, "value IDL attribute of input type hidden without value attribute");
test(function() {
  var input = document.createElement("input");
  input.type = "hidden";
  input.setAttribute("value", "bar");
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "foo\r\r\n\n\0");
}, "value IDL attribute of input type hidden with value attribute");

test(function () {
  var input = document.createElement("input");
  input.type = "submit";
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "foo\r\r\n\n\0");
}, "value IDL attribute of input type submit without value attribute");
test(function() {
  var input = document.createElement("input");
  input.type = "submit";
  input.setAttribute("value", "bar");
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "foo\r\r\n\n\0");
}, "value IDL attribute of input type submit with value attribute");

test(function () {
  var input = document.createElement("input");
  input.type = "image";
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "foo\r\r\n\n\0");
}, "value IDL attribute of input type image without value attribute");
test(function() {
  var input = document.createElement("input");
  input.type = "image";
  input.setAttribute("value", "bar");
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "foo\r\r\n\n\0");
}, "value IDL attribute of input type image with value attribute");

test(function () {
  var input = document.createElement("input");
  input.type = "reset";
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "foo\r\r\n\n\0");
}, "value IDL attribute of input type reset without value attribute");
test(function() {
  var input = document.createElement("input");
  input.type = "reset";
  input.setAttribute("value", "bar");
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "foo\r\r\n\n\0");
}, "value IDL attribute of input type reset with value attribute");

test(function () {
  var input = document.createElement("input");
  input.type = "button";
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "foo\r\r\n\n\0");
}, "value IDL attribute of input type button without value attribute");
test(function() {
  var input = document.createElement("input");
  input.type = "button";
  input.setAttribute("value", "bar");
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "foo\r\r\n\n\0");
}, "value IDL attribute of input type button with value attribute");

// MODE DEFAULT/ON
test(function () {
  var input = document.createElement("input");
  input.type = "checkbox";
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "foo\r\r\n\n\0");
}, "value IDL attribute of input type checkbox without value attribute");
test(function() {
  var input = document.createElement("input");
  input.type = "checkbox";
  input.setAttribute("value", "bar");
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "foo\r\r\n\n\0");
}, "value IDL attribute of input type checkbox with value attribute");

test(function () {
  var input = document.createElement("input");
  input.type = "radio";
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "foo\r\r\n\n\0");
}, "value IDL attribute of input type radio without value attribute");
test(function() {
  var input = document.createElement("input");
  input.type = "radio";
  input.setAttribute("value", "bar");
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "foo\r\r\n\n\0");
}, "value IDL attribute of input type radio with value attribute");

// MODE VALUE
test(function () {
  var input = document.createElement("input");
  input.type = "text";
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "foo\0");
}, "value IDL attribute of input type text without value attribute");
test(function() {
  var input = document.createElement("input");
  input.type = "text";
  input.setAttribute("value", "bar");
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "foo\0");
}, "value IDL attribute of input type text with value attribute");

test(function () {
  var input = document.createElement("input");
  input.type = "search";
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "foo\0");
}, "value IDL attribute of input type search without value attribute");
test(function() {
  var input = document.createElement("input");
  input.type = "search";
  input.setAttribute("value", "bar");
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "foo\0");
}, "value IDL attribute of input type search with value attribute");

test(function () {
  var input = document.createElement("input");
  input.type = "tel";
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "foo\0");
}, "value IDL attribute of input type tel without value attribute");
test(function() {
  var input = document.createElement("input");
  input.type = "tel";
  input.setAttribute("value", "bar");
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "foo\0");
}, "value IDL attribute of input type tel with value attribute");

test(function () {
  var input = document.createElement("input");
  input.type = "url";
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "foo\0");
}, "value IDL attribute of input type url without value attribute");
test(function() {
  var input = document.createElement("input");
  input.type = "url";
  input.setAttribute("value", "bar");
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "foo\0");
}, "value IDL attribute of input type url with value attribute");

test(function () {
  var input = document.createElement("input");
  input.type = "email";
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "foo\0");
}, "value IDL attribute of input type email without value attribute");
test(function() {
  var input = document.createElement("input");
  input.type = "email";
  input.setAttribute("value", "bar");
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "foo\0");
}, "value IDL attribute of input type email with value attribute");

test(function () {
  var input = document.createElement("input");
  input.type = "password";
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "foo\0");
}, "value IDL attribute of input type password without value attribute");
test(function() {
  var input = document.createElement("input");
  input.type = "password";
  input.setAttribute("value", "bar");
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "foo\0");
}, "value IDL attribute of input type password with value attribute");

test(function () {
  var input = document.createElement("input");
  input.type = "datetime-local";
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "");
}, "value IDL attribute of input type datetime-local without value attribute");
test(function() {
  var input = document.createElement("input");
  input.type = "datetime-local";
  input.setAttribute("value", "bar");
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "");
}, "value IDL attribute of input type datetime-local with value attribute");

test(function () {
  var input = document.createElement("input");
  input.type = "date";
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "");
}, "value IDL attribute of input type date without value attribute");
test(function() {
  var input = document.createElement("input");
  input.type = "date";
  input.setAttribute("value", "bar");
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "");
}, "value IDL attribute of input type date with value attribute");

test(function () {
  var input = document.createElement("input");
  input.type = "month";
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "");
}, "value IDL attribute of input type month without value attribute");
test(function() {
  var input = document.createElement("input");
  input.type = "month";
  input.setAttribute("value", "bar");
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "");
}, "value IDL attribute of input type month with value attribute");

test(function () {
  var input = document.createElement("input");
  input.type = "week";
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "");
}, "value IDL attribute of input type week without value attribute");
test(function() {
  var input = document.createElement("input");
  input.type = "week";
  input.setAttribute("value", "bar");
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "");
}, "value IDL attribute of input type week with value attribute");

test(function () {
  var input = document.createElement("input");
  input.type = "time";
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "");
}, "value IDL attribute of input type time without value attribute");
test(function() {
  var input = document.createElement("input");
  input.type = "time";
  input.setAttribute("value", "bar");
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "");
}, "value IDL attribute of input type time with value attribute");

test(function () {
  var input = document.createElement("input");
  input.type = "number";
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "");
}, "value IDL attribute of input type number without value attribute");
test(function() {
  var input = document.createElement("input");
  input.type = "number";
  input.setAttribute("value", "bar");
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "");
}, "value IDL attribute of input type number with value attribute");

test(function () {
  var input = document.createElement("input");
  input.type = "range";
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "50");
}, "value IDL attribute of input type range without value attribute");
test(function() {
  var input = document.createElement("input");
  input.type = "range";
  input.setAttribute("value", "bar");
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "50");
}, "value IDL attribute of input type range with value attribute");

test(function () {
  var input = document.createElement("input");
  input.type = "color";
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "#000000");
}, "value IDL attribute of input type color without value attribute");
test(function() {
  var input = document.createElement("input");
  input.type = "color";
  input.setAttribute("value", "bar");
  input.value = "foo\r\r\n\n\0";
  assert_equals(input.value, "#000000");
}, "value IDL attribute of input type color with value attribute");

// MODE FILENAME
test(function () {
  var input = document.createElement("input");
  input.type = "file";

  for (const emptyValue of ["", null]) {
    input.value = emptyValue;
    assert_equals(input.value, "", `input.value is empty after assigning ${emptyValue}`);
  }

  for (const invalidValue of ["foo", 10, undefined]) {
    assert_throws_dom("InvalidStateError", () => {
      input.value = invalidValue;
    });
    assert_equals(input.value, "", `input.value is empty after assigning ${invalidValue}`);
  }
}, "value IDL attribute of input type file without value attribute");
test(function() {
  var input = document.createElement("input");
  input.type = "file";
  input.setAttribute("value", "bar");
  assert_equals(input.value, "", "input.value is empty even with a value attribute");

  input.value = "";
  assert_equals(input.getAttribute("value"), "bar", "Setting input.value does not change the value attribute");
}, "value IDL attribute of input type file with value attribute");
</script>
